Skip to content

TypeScript 使用手册

1. TypeScript 简介

核心价值

  • 静态类型检查:编译时捕获类型错误(如 string 误用为 number)。
  • 类型推导:自动推断变量类型(如 let age = 30age: number)。
  • ES6+ 支持:支持类、模块、箭头函数等现代语法。
  • 工具增强:编辑器智能提示、重构支持。
typescript
// 示例:类型错误检测
let price: number = 100;
price = '200'; // 🚨 编译错误:不能将类型 'string' 分配给类型 'number'

2. 环境搭建

安装

bash
npm install -g typescript  # 全局安装 TS 编译器
tsc --init                 # 生成 tsconfig.json

编译

bash
tsc app.ts                 # 编译单个文件
tsc                        # 编译所有文件(需 tsconfig.json)

3. 基础类型

内置类型

typescript
let isDone: boolean = true;
let count: number = 42;
let name: string = 'Alice';
let list: number[] = [1, 2, 3]; // 数组
let tuple: [string, number] = ['a', 1]; // 元组
let anything: any = '可以任意赋值'; // 慎用!
let nothing: void = undefined; // 常用于无返回值的函数

特殊类型

typescript
let u: undefined = undefined; // 仅能赋值为 undefined
let n: null = null; // 仅能赋值为 null
let random: unknown = 'Hello'; // 比 any 更安全的顶层类型
if (typeof random === 'string') {
    console.log(random.length); // 需类型收窄后才能操作
}

4. 接口(Interface)

定义对象结构

typescript
interface User {
    id: number;
    name: string;
    email?: string; // 可选属性
    readonly role: 'admin' | 'user'; // 只读属性 + 字面量联合类型
}

const alice: User = {
    id: 1,
    name: 'Alice',
    role: 'admin' // ✅ 合法
};
alice.role = 'user'; // 🚨 错误:只读属性不可修改

函数类型

typescript
interface SearchFunc {
    (source: string, keyword: string): boolean; // 定义函数签名
}

const search: SearchFunc = (src, kw) => src.includes(kw);

5. 类(Class)

基础语法

typescript
class Animal {
    private _age: number; // 私有属性(仅类内访问)
    constructor(
        public name: string,
        age: number
    ) {
        // 参数属性简写
        this._age = age;
    }

    public move(distance: number = 0) {
        console.log(`${this.name} moved ${distance}m`);
    }
}

class Dog extends Animal {
    bark() {
        console.log('Woof!');
    }
}

const dog = new Dog('Buddy', 3);
dog.bark(); // ✅ "Woof!"
dog.move(10); // ✅ "Buddy moved 10m"

6. 泛型(Generics)

复用类型逻辑

typescript
function identity<T>(arg: T): T {
    // T 是类型变量
    return arg;
}
const output = identity<string>('hello'); // 显式指定 T 为 string
const inferred = identity(42); // 自动推导 T 为 number

// 泛型约束
interface Lengthwise {
    length: number;
}
function loggingIdentity<T extends Lengthwise>(arg: T): T {
    console.log(arg.length); // ✅ 因为 T 被约束为有 length 属性
    return arg;
}

7. 高级类型

联合类型(Union)

typescript
type Status = 'pending' | 'success' | 'error'; // 字面量联合
type ID = number | string; // 类型联合

function printId(id: ID) {
    if (typeof id === 'string') {
        console.log(id.toUpperCase()); // 类型收窄
    } else {
        console.log(id.toFixed(2));
    }
}

交叉类型(Intersection)

typescript
interface Employee {
    id: number;
    role: string;
}
interface Contact {
    email: string;
}
type EmployeeContact = Employee & Contact; // 合并类型

const emp: EmployeeContact = {
    id: 1,
    role: 'dev',
    email: 'dev@example.com'
};

类型别名(Type Alias)

typescript
type Point = {
    x: number;
    y: number;
};
type Callback = (data: string) => void; // 函数类型别名

8. 模块系统

导出/导入

typescript
// math.ts
export const PI = 3.14;
export function circleArea(radius: number): number {
    return PI * radius ** 2;
}

// app.ts
import { PI, circleArea } from './math';
console.log(circleArea(10)); // 314

默认导出

typescript
// logger.ts
export default class Logger {
    log(message: string) {
        console.log(message);
    }
}

// app.ts
import MyLogger from './logger'; // 名称自由定义
const logger = new MyLogger();

9. 配置文件 tsconfig.json

关键配置项

json
{
    "compilerOptions": {
        "target": "ES2020", // 编译目标 JS 版本
        "module": "ESNext", // 模块系统 (CommonJS/ES6)
        "strict": true, // 启用所有严格检查
        "outDir": "./dist", // 输出目录
        "esModuleInterop": true, // 改进 CommonJS/ES6 互操作
        "skipLibCheck": true // 跳过库类型检查(提升性能)
    },
    "include": ["src/**/*.ts"], // 包含文件
    "exclude": ["node_modules"] // 排除文件
}

10. 与 JavaScript 互操作

使用 .d.ts 类型声明

typescript
// 为 JS 库提供类型(如 lodash)
declare module 'lodash' {
    export function chunk<T>(array: T[], size: number): T[][];
}

渐进式迁移

  1. .js 重命名为 .ts,逐步修复类型错误。
  2. 使用 // @ts-ignore 临时忽略错误(慎用)。

最佳实践

  1. 避免 any:优先用 unknown + 类型收窄。
  2. 启用严格模式tsconfig.json 中设置 "strict": true
  3. 类型即文档:为函数/接口添加 JSDoc 注释:
    typescript
    /** 计算用户折扣后的价格 */
    function applyDiscount(price: number, discount: number): number {
        return price * (1 - discount);
    }
  4. 使用工具链
    • ESLint:代码规范检查
    • Prettier:代码格式化
    • ts-node:直接运行 TS 文件

延伸学习

通过类型系统提升代码健壮性,享受开发效率与维护性的双重提升! 🚀